package com.team.game.framework.impl;

import android.annotation.SuppressLint;
import android.content.res.AssetManager;
import android.gesture.Gesture;
import android.gesture.GestureLibraries;
import android.gesture.GestureLibrary;
import android.gesture.GestureOverlayView;
import android.gesture.Prediction;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;

import com.crashlytics.android.Crashlytics;
import com.team.game.R;
import com.team.game.Screens.Main_Screen;
import com.team.game.framework.Abstract.GesturesInfo;
import com.team.game.framework.Game;
import com.team.game.framework.Screen;

import java.util.ArrayList;

import io.fabric.sdk.android.Fabric;

import static com.team.game.framework.impl.Scale_X_Y.getRealScreenSize;

public class MainActivity extends AppCompatActivity implements View.OnTouchListener, Game, GestureOverlayView.OnGesturePerformedListener {

    @SuppressWarnings("unused")
    private static final String TAG = "Main_Activity";

    public static AssetManager manager;

    private View mDecorView;
    private GestureOverlayView gestureOverlayView;
    private ArrayList<GestureLibrary> mGestureLib;
    private Screen screen;

    private DataBase dataBase;
    private boolean gestureActive;
    private boolean changed = false;
    private boolean noStartScreen = false;
    private boolean waitForTab = false;
    private final GesturesInfo gestureInfo = new GesturesInfo();


    private int current_Wizard = 0;

    @SuppressLint("ClickableViewAccessibility")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i (TAG, "OnCreate");

        //Подключаем фабрик
        Fabric.with (this, new Crashlytics ());

        //Ставим на весь єкран
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);


        //убираем тулбары
        mDecorView = getWindow().getDecorView();
        //устанавливаем размеры экрана и коеф масштабирования
        getRealScreenSize (getWindowManager ().getDefaultDisplay ());

        //статическая переменная
        //чтобы иметь возможность декодировать ассеты откуда угодно
        manager = getAssets();


        gestureOverlayView = new GestureOverlayView (this);
        gestureOverlayView.setOrientation (GestureOverlayView.ORIENTATION_VERTICAL);
        gestureOverlayView.setEventsInterceptionEnabled (false);
        gestureOverlayView.setGestureStrokeType (GestureOverlayView.GESTURE_STROKE_TYPE_MULTIPLE);
        // gestureOverlayView.setFadeEnabled (false);
        // gestureOverlayView.setFadeOffset (0);
        gestureActive = false;
        gestureOverlayView.setGestureVisible (false);

        //ставим обработчик тачей на верхний слой
        gestureOverlayView.setOnTouchListener (this);

        FrameLayout frameLayout = new FrameLayout (this);
        frameLayout.addView (new Surface (this, this), 0);
        frameLayout.addView (gestureOverlayView, 1);

        setContentView (frameLayout);
    //  getApplicationContext().deleteDatabase("myDB");
//
        dataBase = new DataBase(this);

// -----------------------Test_sound-----------------------------
        //Audio audio = new AndroidAudio(this);

        //Music music = audio.newMusic("Music/music.mp3");
        //music.play();
        //music.setLooping(true);

        //Sound sound, sound1;
        //sound = audio.newSound("Sound/zvuk1.mp3");
        //sound1 = audio.newSound("Sound/zvuk.mp3");
// ---------------------------------------------------------------
    }

    //activity
    @Override
    protected void onStart() {
        super.onStart();
        Log.i (TAG, "OnStart");

        if (!noStartScreen)
            screen = getStartScreen();
    }

    @Override
    protected void onResume () {
        super.onResume ();
        Log.i (TAG, "OnResume");

        if (!noStartScreen)
            this.getCurrentScreen ().resume ();
    }

    @Override
    protected void onPause () {
        super.onPause ();
        Log.i (TAG, "OnPause");

        this.getCurrentScreen ().pause ();
    }

    @Override
    protected void onDestroy () {
        super.onDestroy ();
        Log.i (TAG, "OnDestroy");
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {  // якщоя не
        super.onWindowFocusChanged(hasFocus);
        if (Build.VERSION.SDK_INT >= 19)    // срабатывает при анроид 4.4 и выше
            if (hasFocus) {
                mDecorView.setSystemUiVisibility(    // флаги для кнопок
                        View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION   // прячем панель навигации
                                | View.SYSTEM_UI_FLAG_FULLSCREEN       // прячем строку состояния
                                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
            }
    }

    @Override
    public void onBackPressed () {
        Log.i (TAG, "OnBackPressed");

        this.getCurrentScreen ().back ();
        //поставить на паузу
        //можно открыть диалог
        //давай играй и смотри рекламу
    }

    @SuppressLint("ClickableViewAccessibility")
    @Override
    public boolean onTouch (View v, MotionEvent event) {
        if (!SurfaceThread.wait)
            this.getCurrentScreen ().touchEvent (event);
        return true;
    }


    @Override
    public void setScreen(Screen screen) {
        this.screen.pause();
        this.screen.dispose();
        this.screen = screen;
        /*Вызываем методы возобновления и обновления состояния нового экрана*/
        screen.resume();
        screen.update();
        /*Устанавливаем полученный экран в качестве текущего*/

    }

    @Override
    public Screen getStartScreen() {
        noStartScreen = true;
        return new Main_Screen(this);
    }

    @Override
    public Screen getCurrentScreen() {
        return this.screen;
    }


    @Override
    public void activateGestures (boolean enabled) {
        //меняем видимость жестов
        gestureOverlayView.setGestureVisible (enabled);
        gestureActive = enabled;
    }

//    @Override
//    public gestureInfo getGestures () {
//        //передаем структуру только если жест изменился
//        if (changed)
//            return this.gestureInfo;
//        else
//            return null;
//    }

    @Override
    public void onGesturePerformed (GestureOverlayView gestureOverlayView, Gesture gesture) {
        if (gestureActive) {
            if (!waitForTab) {
                Log.i(TAG, "Recognizing gesture");
                //формируем лист предположительных жестов
                ArrayList<Prediction> predictions = mGestureLib.get(current_Wizard).recognize(gesture);
                changed = false;
                if (predictions.size() > 0) {
                    //если жест распознан
                    //берем первый из листа
                    Prediction prediction = predictions.get(0);
                    //устанавливаем степень распознавания
                    if (prediction.score > 5.0) {
                        Log.i(TAG, "Gesture recognized with score: " + prediction.score + "-> Setting gestureInfo properties");
                        /* Если жест распознан
                         * Заполняем локальную структуру
                         * И в методе getGestures передаем ее для обработки */
                        gestureInfo.setGestures(gesture, prediction);
//                    this.gestureInfo.gesture = gesture;
//                    this.gestureInfo.prediction = prediction;
                        waitForTab = this.getCurrentScreen().getGestures().setGestureInfo(gestureInfo, current_Wizard);
                        // changed = true;
                    }
                }
            }
        }
    }

    @Override
    public void setGestures(int[] Wizards, int Num) {
        //включаем видимость жестов
        gestureOverlayView.setGestureVisible (true);
        gestureActive = true;
        mGestureLib = new ArrayList<>(Num);
        //передаем обработку жестов методу этого класса
        gestureOverlayView.addOnGesturePerformedListener (this);

        //декодируем паки с жестами в зависимости от нужной локации
        for (int i = 0; i < Num; i++) {
            switch (Wizards[i]) {
                case 1: {
                    mGestureLib.add(i, GestureLibraries.fromRawResource(this, R.raw.gesture));
                    break;
                }
                case 2:
                case 3:
                default:
                    throw new RuntimeException("No resources for this level ");
            }
            //загружаем жесты
            if (!mGestureLib.get(i).load()) {
                finish();
                throw new RuntimeException("Failed to load gestures library");
            }
        }


    }

    @Override
    public void setCurrentWizard(int Num) {
        current_Wizard = Num;
    }

    @Override
    public DataBase getDatabase() {
        return dataBase;
    }

    @Override
    public void waitForTap(boolean wait) {
        waitForTab = wait;
    }
}


